package com.hd.trans.share;


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

public class ReqUtil {
    private ReqUtil() {
    }

    /**
     * 将json中除datasign外的其它所有的参数(包含公共参数 和 其它非公共参数) ，按参数名称的字母排序,如：a=1&b=2&c=3，
     * 组合为：a=1&b=2&c=3|b6C10f3SUzQDAxZi 加密，其中 |b6C10f3SUzQDAxZi 为 校验码，
     * 32位小写 待加密的字符串中，空值不参与加密；
     * 支付接口 payorer 加密时 因为 在payorderparm中 prouctid加密处理过，所以 待加密中 productid 不再参与；
     * 加密结果以 datasign加入json中，如： {"a":1,"b":2,"c":"3","datasign":"ff7f0c6f941f353e43a509cd0ddd048c"}
     */
    private static final String CHECK_CODE = PublicBeanManager.SIGNATURE;

    /**
     * 将json中除datasign外的其它所有的参数(包含公共参数 和 其它非公共参数) ，
     * 按参数名称的字母排序,如：a=1&b=2&c=3，
     * 组合为：a=1&b=2&c=3hUuPd20171206LuOnDmd5加密，
     * 其中 hUuPd20171206LuOnD 为 校验码，32位小写 待加密的字符串中，空值不参与加密；
     *
     * @param arguments
     * @return
     */
    public static String appendArgumentMapToMd5String(Map<String, Object> arguments) {
        final ArrayList<Map.Entry<String, Object>> sortList = sortRequestBean(arguments);
        return appendArgumentMapToMd5String(sortList, CHECK_CODE);
    }

    public static String appendArgumentMapToMd5String(Map<String, Object> arguments, String checkCode) {
        final ArrayList<Map.Entry<String, Object>> sortList = sortRequestBean(arguments);
        return appendArgumentMapToMd5String(sortList, checkCode);
    }


    /**
     * 按字母对参数进行排序
     *
     * @param arguments
     * @return
     */
    private static ArrayList<Map.Entry<String, Object>> sortRequestBean(Map<String, Object> arguments) {
        final ArrayList<Map.Entry<String, Object>> sortList = new ArrayList<Map.Entry<String, Object>>(arguments.entrySet());
        Collections.sort(sortList, new Comparator<Map.Entry<String, Object>>() {
            @Override
            public int compare(Map.Entry<String, Object> item1, Map.Entry<String, Object> item2) {
                return item1.getKey().compareTo(item2.getKey());
            }
        });
        return new ArrayList<>(sortList);
    }

    public static String appendArgumentMapToMd5String(List<Map.Entry<String, Object>> arguments, String checkCode) {
        StringBuilder stringBuilder = new StringBuilder();
        for (Map.Entry<String, Object> map : arguments) {
            stringBuilder.append("&").append(map.getKey()).append("=").append(map.getValue());
        }
        /** 校验码 */
        stringBuilder.append(checkCode);
        String md5Json = stringBuilder.toString();
        if (md5Json.startsWith("&")) {
            md5Json = md5Json.replaceFirst("&", "");
        }
        return md5Json;
    }

}
